#include <iostream>
#include <WinSock2.h>
class Base {
public:
    virtual void hello() {
        std::cout << "base" << std::endl;
    }

    void show() const {

    }
};

class Father {
public:
    virtual void hello() {
        std::cout << "base" << std::endl;
    }
};

class Derived : public Base {
public:
    void hello() override {
        //Base::hello();
        std::cout << "derived" << std::endl;
    }
};

class Son : public Base {
public:
    void hello() override {
        std::cout << "derived" << std::endl;
    }
    virtual void show()  {
        std::cout << "derived" << std::endl;
    }
};

int main() {
    // static_cast : 1. 静态类型转换（static_cast）
    //static_cast 是一种编译时类型转换，主要用于在相关类型之间进行安全的转换。它不能进行类型检查，因此只能用于那些在编译时可以确定的类型转换。
    //适用场景
    //基本数据类型之间的转换（如 int 转 float）。
    //派生类指针/引用到基类指针/引用的转换。
    //枚举类型之间的转换。

    // const_cast: 去除 const 属性
    // reinterpret_cast: 类指针和基本数据类型之间的转换，没有继承关系的类指针之间转换。
    // dynamic_cast: 向下转型，父类指针转子类指针，类型不安全。转化不成功会返回 nullptr。

    //C++基类和派生类的智能指针转换：static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_cast
    try {
        // static_cast
        double d = 5.5;
        int i = static_cast<int>(d);  // i = 5
        // 向上转型
        Derived derived;
        // derived.hello();
        Base &basePtr = dynamic_cast<Base &>(derived);

        Base *base = new Derived();
        // Derived *d1 =dynamic_cast<Derived *>(base);
        Son *son = dynamic_cast<Son *>(base);
        //son->show();
        const int a =10;



        // reinterpret_cast
//    int a = 0x01;
//    Derived *d1 = reinterpret_cast<Derived *>(a);
//    Father *f = reinterpret_cast<Father *>(d1);
    }
    catch (std::bad_cast &e){
        std::cout << e.what() << std::endl;
    }

    return 0;
}
